home *** CD-ROM | disk | FTP | other *** search
/ IRIX Patches 1995 June / SGI IRIX Patches 1995 Jun.iso / 5.3_patches / patchSG0000154 / patchSG0000154.idb / usr / share / src / OpenGL / samples / shape.c.z / shape.c
Encoding:
C/C++ Source or Header  |  1995-06-12  |  4.5 KB  |  245 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6.  
  7. #define OPENGL_WIDTH 24
  8. #define OPENGL_HEIGHT 13
  9.  
  10.  
  11. GLenum rgb, doubleBuffer, directRender, windType;
  12. GLint objectIndex = 0;
  13. GLuint bases[20];
  14. float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
  15. float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
  16. float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
  17.  
  18.  
  19. static void Init(void)
  20. {
  21.  
  22.     bases[0] = glGenLists(1);
  23.     tkWireSphere(bases[0], 5.0);
  24.     bases[1] = glGenLists(1);
  25.     tkSolidSphere(bases[1], 5.0);
  26.     bases[2] = glGenLists(1);
  27.     tkWireCube(bases[2], 5.0);
  28.     bases[3] = glGenLists(1);
  29.     tkSolidCube(bases[3], 5.0);
  30.     bases[4] = glGenLists(1);
  31.     tkWireBox(bases[4], 4.0, 5.0, 6.0);
  32.     bases[5] = glGenLists(1);
  33.     tkSolidBox(bases[5], 4.0, 5.0, 6.0);
  34.     bases[6] = glGenLists(1);
  35.     tkWireTorus(bases[6], 5.0, 5.0);
  36.     bases[7] = glGenLists(1);
  37.     tkSolidTorus(bases[7], 5.0, 5.0);
  38.     bases[8] = glGenLists(1);
  39.     tkWireCylinder(bases[8], 5.0, 5.0);
  40.     bases[9] = glGenLists(1);
  41.     tkSolidCylinder(bases[9], 5.0, 5.0);
  42.     bases[10] = glGenLists(1);
  43.     tkWireCone(bases[10], 5.0, 5.0);
  44.     bases[11] = glGenLists(1);
  45.     tkSolidCone(bases[11], 5.0, 5.0);
  46.  
  47.     glClearColor(0.0, 0.0, 0.0, 0.0);
  48.     glClearIndex(0.0);
  49. }
  50.  
  51. static void Reshape(int width, int height)
  52. {
  53.  
  54.     glViewport(0, 0, (GLint)width, (GLint)height);
  55.  
  56.     glMatrixMode(GL_PROJECTION);
  57.     glLoadIdentity();
  58.     glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
  59.     glMatrixMode(GL_MODELVIEW);
  60. }
  61.  
  62. static GLenum Key(int key, GLenum mask)
  63. {
  64.  
  65.     switch (key) {
  66.       case TK_ESCAPE:
  67.         tkQuit();
  68.  
  69.       case TK_SPACE:
  70.     objectIndex++;
  71.     if (objectIndex > 11) {
  72.         objectIndex = 0;
  73.     }
  74.     break;
  75.  
  76.       case TK_LEFT:
  77.     shiftX -= 20.0;
  78.     break;
  79.       case TK_RIGHT:
  80.     shiftX += 20.0;
  81.     break;
  82.       case TK_UP:
  83.     shiftY += 20.0;
  84.     break;
  85.       case TK_DOWN:
  86.     shiftY -= 20.0;
  87.     break;
  88.       case TK_n:
  89.     shiftZ += 20.0;
  90.     break;
  91.       case TK_m:
  92.     shiftZ -= 20.0;
  93.     break;
  94.  
  95.       case TK_q:
  96.     scaleX -= 0.1;
  97.     if (scaleX < 0.1) {
  98.         scaleX = 0.1;
  99.     }
  100.     break;
  101.       case TK_w:
  102.     scaleX += 0.1;
  103.     break;
  104.       case TK_a:
  105.     scaleY -= 0.1;
  106.     if (scaleY < 0.1) {
  107.         scaleY = 0.1;
  108.     }
  109.     break;
  110.       case TK_s:
  111.     scaleY += 0.1;
  112.     break;
  113.       case TK_z:
  114.     scaleZ -= 0.1;
  115.     if (scaleZ < 0.1) {
  116.         scaleZ = 0.1;
  117.     }
  118.     break;
  119.       case TK_x:
  120.     scaleZ += 0.1;
  121.     break;
  122.  
  123.       case TK_e:
  124.     angleX -= 5.0;
  125.     if (angleX < 0.0) {
  126.         angleX = 360.0 + angleX;
  127.     }
  128.     break;
  129.       case TK_r:
  130.     angleX += 5.0;
  131.     if (angleX > 360.0) {
  132.         angleX = angleX - 360.0;
  133.     }
  134.     break;
  135.       case TK_d:
  136.     angleY -= 5.0;
  137.     if (angleY < 0.0) {
  138.         angleY = 360.0 + angleY;
  139.     }
  140.     break;
  141.       case TK_f:
  142.     angleY += 5.0;
  143.     if (angleY > 360.0) {
  144.         angleY = angleY - 360.0;
  145.     }
  146.     break;
  147.       case TK_c:
  148.     angleZ -= 5.0;
  149.     if (angleZ < 0.0) {
  150.         angleZ = 360.0 + angleZ;
  151.     }
  152.     break;
  153.       case TK_v:
  154.     angleZ += 5.0;
  155.     if (angleZ > 360.0) {
  156.         angleZ = angleZ - 360.0;
  157.     }
  158.     break;
  159.       default:
  160.     return GL_FALSE;
  161.     }
  162.     return GL_TRUE;
  163. }
  164.  
  165. static void Draw(void)
  166. {
  167.  
  168.     glClear(GL_COLOR_BUFFER_BIT);
  169.  
  170.     TK_SETCOLOR(windType, TK_WHITE);
  171.  
  172.     glPushMatrix();
  173.  
  174.     glTranslatef(shiftX, shiftY, shiftZ);
  175.     glRotatef(angleX, 1.0, 0.0, 0.0);
  176.     glRotatef(angleY, 0.0, 1.0, 0.0);
  177.     glRotatef(angleZ, 0.0, 0.0, 1.0);
  178.     glScalef(scaleX, scaleY, scaleZ);
  179.  
  180.     glCallList(bases[objectIndex]);
  181.     glPopMatrix();
  182.  
  183.     glFlush();
  184.  
  185.     if (doubleBuffer) {
  186.     tkSwapBuffers();
  187.     }
  188. }
  189.  
  190. static GLenum Args(int argc, char **argv)
  191. {
  192.     GLint i;
  193.  
  194.     rgb = GL_TRUE;
  195.     doubleBuffer = GL_FALSE;
  196.     directRender = GL_TRUE;
  197.  
  198.     for (i = 1; i < argc; i++) {
  199.     if (strcmp(argv[i], "-ci") == 0) {
  200.         rgb = GL_FALSE;
  201.     } else if (strcmp(argv[i], "-rgb") == 0) {
  202.         rgb = GL_TRUE;
  203.     } else if (strcmp(argv[i], "-sb") == 0) {
  204.         doubleBuffer = GL_FALSE;
  205.     } else if (strcmp(argv[i], "-db") == 0) {
  206.         doubleBuffer = GL_TRUE;
  207.     } else if (strcmp(argv[i], "-dr") == 0) {
  208.         directRender = GL_TRUE;
  209.     } else if (strcmp(argv[i], "-ir") == 0) {
  210.         directRender = GL_FALSE;
  211.     } else {
  212.         printf("%s (Bad option).\n", argv[i]);
  213.         return GL_FALSE;
  214.     }
  215.     }
  216.     return GL_TRUE;
  217. }
  218.  
  219. void main(int argc, char **argv)
  220. {
  221.  
  222.     if (Args(argc, argv) == GL_FALSE) {
  223.     tkQuit();
  224.     }
  225.  
  226.     tkInitPosition(0, 0, 400, 400);
  227.  
  228.     windType = (rgb) ? TK_RGB : TK_INDEX;
  229.     windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  230.     windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  231.     tkInitDisplayMode(windType);
  232.  
  233.     if (tkInitWindow("Font Test") == GL_FALSE) {
  234.     tkQuit();
  235.     }
  236.  
  237.     Init();
  238.  
  239.     tkExposeFunc(Reshape);
  240.     tkReshapeFunc(Reshape);
  241.     tkKeyDownFunc(Key);
  242.     tkDisplayFunc(Draw);
  243.     tkExec();
  244. }
  245.